package net.sh.dpinfrastructure.http;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;

import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;

import net.sh.dpinfrastructure.exception.DPException;

/**
 * 
 * http请求接口
 * 
 * @version 1.0
 * @since JDK1.7
 * @author shaohui
 * @company 上海朝阳永续信息技术有限公司
 * @copyright (c) 2016 SunTime Co'Ltd Inc. All rights reserved.
 * @date 2016年8月10日 上午11:17:15
 */
public interface DPHttp {
    
    /**
     * 
     * delete 请求
     *
     * @param url
     * @return
     * 
     * @author shaohui
     * @date 2016年8月10日 上午11:29:09
     */
    DPHttpResponse delete(String url);
    
    /**
     * 
     * delete 请求
     *
     * @param url
     * @param params
     * @return
     * 
     * @author shaohui
     * @date 2016年8月10日 上午11:28:43
     */
    DPHttpResponse delete(String url, Map<String, String> params);
    
    /**
     * delete 请求
     * @param url
     * @param headParams
     * @param params
     * @return
     */
    DPHttpResponse delete(String url, Map<String, String> headParams, Map<String, String> params);
    
    /**
     * 
     * get请求
     *
     * @param url
     * @return
     * 
     * @author shaohui
     * @date 2016年8月10日 上午11:20:25
     */
    DPHttpResponse get(String url);
    
    /**
     * get请求
     * @param url
     * @param params
     * @return
     */
    DPHttpResponse get(String url, Map<String, String> params);
    
    /**
     * 
     * 带http头参数及请求参数的get请求
     * 
     * @param url
     * @param headParams head参数
     * @param params url参数
     * @return
     * 
     * @author shaohui
     * @date 2015年9月15日 下午3:52:20
     */
    DPHttpResponse get(String url, Map<String, String> headParams, Map<String, String> params);
    
    /**
     * 
     * post请求
     *
     * @param url
     * @return
     * 
     * @author shaohui
     * @date 2016年8月10日 上午11:22:02
     */
    DPHttpResponse post(String url);
    
    /**
     * post请求
     * @param url
     * @param params
     * @return
     */
    DPHttpResponse post(String url, Map<String, String> params);
    
    /**
     * 
     * post 请求
     *
     * @param url 
     * @param headParams 请求头参数
     * @param params post请求参数
     * @return
     * 
     * @author shaohui
     * @date 2015年9月16日 下午5:19:54
     */
    DPHttpResponse post(String url, Map<String, String> headParams, Map<String, String> params);
    
    /**
     * 
     * put 请求
     *
     * @param url
     * @return
     * 
     * @author shaohui
     * @date 2016年8月10日 上午11:26:49
     */
    DPHttpResponse put(String url);

    /**
     * put 请求
     * @param url
     * @param params
     * @return
     */
    DPHttpResponse put(String url, Map<String, String> params);

    /**
     * put 请求
     * @param url
     * @param headParams
     * @param params
     * @return
     */
    DPHttpResponse put(String url, Map<String, String> headParams, Map<String, String> params);
    
    /**
     * 
     * http请求
     *
     * @param requestType
     * @param url
     * @param headParams
     * @param params
     * @return
     * 
     * @author shaohui
     * @date 2016年8月11日 下午12:56:05
     */
    DPHttpResponse request(DPHttpRequestMethod requestType, String url, Map<String, String> headParams, Map<String, String> params);
    
    /**
     * 
     * 构造http get请求带参数的url
     *
     * @param url
     * @param params
     * @return
     * 
     * @author shaohui
     * @date 2016年8月11日 上午10:08:13
     */
    public static String createUrlWithParams(String url, Map<String, String> params) {
        if (MapUtils.isEmpty(params)) {
            return url;
        }
        if (url.contains("?")) {
            throw new DPException("指定的url中已包含参数");
        }
        return new StringBuilder(url).append("?").append(createUrlQueryString(params)).toString();
    }
    
    /**
     * 
     * 构造url中的query
     *
     * @param params
     * @return
     * 
     * @author shaohui
     * @date 2016年8月12日 上午9:52:17
     */
    public static String createUrlQueryString(Map<String, String> params) {
        if (MapUtils.isEmpty(params)) {
            return "";
        }
        StringBuilder queryStringBuilder = new StringBuilder();
        int index = 0;
        try {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                String paramName = entry.getKey();
                String paramValue = entry.getValue();
                if (StringUtils.isBlank(paramName)) {
                    continue;
                }
                if (paramValue == null) {
                    paramValue = "";
                }
                if (index != 0) {
                    queryStringBuilder.append("&");
                }
                queryStringBuilder.append(paramName).append("=").append(URLEncoder.encode(paramValue, "utf-8"));
                index++;
            } 
        } catch (UnsupportedEncodingException e) {/*skip*/}
        return queryStringBuilder.toString();
    }
}
